/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package j_table;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.*;
import javax.swing.table.*;
import java.util.Vector;
/**
 *
 * @author Lenovo
 */
public class J_Table extends JFrame implements Runnable{
    //用于倒计时器的属性变量
    private boolean flag = true;
    private boolean flag1 = true;
    //private JPanel contentPane;
    private Timer timer;
    private JTextArea textArea;//显示时间的文本
    private JLabel label;
    private String string = "00:25:00";//初始化时间的字符串
    private int []intArray;

    //用于实现框架功能的变量
    DefaultTableModel m_data;
    JTable m_view;
    calc1 p=new calc1();//新建自动出题算法对象
    JFrame1 acc=new JFrame1();//显示设置的窗体
    JFrame2 mark=new JFrame2();//显示成绩的窗体
    About about=new About();//显示关于信息的窗体
    boolean []test=new boolean[100];//用于保存答案对错的数组
    int []canshu=new int[5];//获取设置属性的数组
    JButton []b={new JButton("自动出题"),new JButton("提交"),new JButton("设置"),new JButton("关于")};
    public J_Table()
    {
        super("小学生四则运算系统");
        Container c=getContentPane();
        c.setLayout(new J_DiagonalLayout());//自定义的布局管理器
        this.setSize(520,600);
        this.setResizable(false);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        int i;        
        for(i=0;i<4;i++)
        {
            c.add(b[i]);
        }
        b[1].setEnabled(false);
        m_data=new DefaultTableModel();
        m_view=new JTable(m_data);
        m_view.setPreferredScrollableViewportSize(new Dimension(360,150));//设置滚轴框的预大小
        m_view.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        JScrollPane sPane=new JScrollPane(m_view);
        c.add(sPane);
        //显示剩余时间的变量
        label = new JLabel("剩余时间：");
        label.setVisible(false);
        label.setFont(new Font("宋体", Font.BOLD,15 ));
        textArea = new JTextArea();
        textArea.setText(string);
        textArea.setVisible(false);
        textArea.setFont(new Font("宋体", Font.BOLD, 18));
        c.add(label);
        c.add(textArea);
        timer = new Timer();//新建Timer对象用于计时
        String []stringArray = string.split(":");
        intArray = new int[3];
        for(i = 0;i < stringArray.length;i++){
             intArray[i] = Integer.parseInt(stringArray[i]);
        }
        b[0].addActionListener(new ActionListener()//添加b[0]的点击事件
        {
            public void actionPerformed(ActionEvent e)
            {
                canshu[0]=acc.result1(acc.a1);//题目数字难度：0.整数 1.一位小数 2.两位小数
                canshu[1]=acc.result1(acc.a2);//算法难度：0.加减 1.加减乘除
                canshu[2]=acc.result1(acc.a3);//有无括号：0.无括号 1.有括号
                canshu[3]=acc.result1(acc.a4);//模式：0.练习模式 1.测试模式 2.考试模式
                canshu[4]=acc.result2(acc.a5);//题目数字范围：0.0-10 1.0-100 2.0-1000
                int rNum=m_data.getRowCount();//获取行数
                int cNum=m_data.getColumnCount();//获取列数
                for(int i=0;i<rNum;i++)
                    mb_deleteRow();//初始化行
                for(int i=0;i<cNum;i++)
                    mb_deleteColumn();//初始化列
                int n=30;
                if(canshu[3]!=0)//根据设置的参数这是出题数目
                    n=50;
                for(int i=0;i<n;i++)
                    mb_addRow(i);
                mb_addColumn();
                rNum=m_data.getRowCount();
                System.out.println(rNum);
                b[1].setEnabled(true);//设置提交按钮可用
                //根据参数判断是否需要计时
                if(canshu[3]==2)
                {
                    timer = new Timer();
                    textArea.setText(string);
                    flag = true;
                    flag1 = true;
                    // TODO Auto-generated method stub
                    string = "00:25:00";
                    String []stringArray = string.split(":");
                    intArray = new int[3];
                     for(int i = 0;i < stringArray.length;i++){
                         intArray[i] = Integer.parseInt(stringArray[i]);
                     }
                    label.setVisible(true);
                    textArea.setVisible(true);
                    timer.schedule(new Task(),0, 1000);
                    //button.setEnabled(false);                    
                }
            }

        });
         b[1].addActionListener(new ActionListener()//添加b[1]的点击事件
        {
            public void actionPerformed(ActionEvent e)
            {
                jiaojuan();//提交答案函数
                if(canshu[3]==2)//停止计时
                {
                    flag1=false;
                    timer.cancel();
                    intArray[0]=0;
                    intArray[1]=0;
                    intArray[2]=0;  
                    //timer=new Timer();
                    //task1.cancel();
                    //timer.schedule(new Task(),0, 1000);
                }
            }
        });
         b[2].addActionListener(new ActionListener()//添加b[2]的点击事件
        {
            public void actionPerformed(ActionEvent e)
            {
                acc.setSize(420,300);
                acc.setVisible(true);//显示设置属性窗体
            }
        });
         b[3].addActionListener(new ActionListener()//添加b[3]的点击事件
        {
            public void actionPerformed(ActionEvent e)
            {
                about.setSize(280,120);
                about.setVisible(true);//显示关于信息窗体
            }
        });

    }
     public void mb_addColumn()//添加列函数
        {
            int cNum=m_data.getColumnCount();
            int rNum=m_data.getRowCount();
            String s="列"+(cNum+1);
            int c=m_view.getSelectedColumn();
            //System.out.println("当前列号为："+c);
            if(cNum==0||rNum==0||c<0)
            {
                m_data.addColumn(s);
                TableColumnModel columns =m_view.getColumnModel();
                TableColumn column = columns.getColumn(0);
                column.setPreferredWidth(300);
                return;
            }
            c++;
            Vector<String> vs=mb_getColumnNames();
            vs.add(c,s);
            Vector data=m_data.getDataVector();
            for(int i=0;i<data.size();i++)
            {
                Vector e=(Vector)data.get(i);
                e.add(c,new String(""));
            }
            //Vector v1=new Vector();
            //v1.add(10);
            m_data.setDataVector(data,vs);
            TableColumnModel columns =m_view.getColumnModel();
            TableColumn column = columns.getColumn(0);
            column.setPreferredWidth(240);
        }
     
        public void mb_addRow(int num)//添加行函数，并调用出题函数
        {
            int cNum=m_data.getColumnCount();
            if(cNum==0)
                mb_addColumn();            
            int r=mb_getRowCurrent();//获取当前行号
            m_data.insertRow(r, (Vector)null);
            String s="";
            s=calculate(num);//调用出题函数
            m_data.setValueAt(s+"=",r, 0);
            m_view.setRowHeight(30);

        }
        public void mb_deleteColumn()//删除所选列函数
        {
            int cNum=m_data.getColumnCount();
            if(cNum==0)
                return;
            int c=m_view.getSelectedColumn();
            if(c<0)
                c=0;
            Vector<String> vs=mb_getColumnNames();
            vs.remove(c);
            Vector data=m_data.getDataVector();
            for(int i=0;i<data.size();i++)
            {
                Vector e=(Vector)data.get(i);
                e.remove(c);
            }
            m_data.setDataVector(data,vs);
        }
        public void mb_deleteColumn1()//删除第三列的函数
        {
            int cNum=m_data.getColumnCount();
            if(cNum==0)
                return;
            int c=2;
            Vector<String> vs=mb_getColumnNames();
            vs.remove(c);
            Vector data=m_data.getDataVector();
            for(int i=0;i<data.size();i++)
            {
                Vector e=(Vector)data.get(i);
                e.remove(c);
            }
            m_data.setDataVector(data,vs);
        }
        public void mb_deleteRow()//删除行函数
        {
            int rNum=m_data.getRowCount();
            if(rNum>0)
            {
                int rEdit=mb_getRowCurrent();
                m_data.removeRow(rEdit);
            }
        }
        public Vector<String> mb_getColumnNames()
        {
            Vector<String> vs=new Vector<String>();
            int cNum=m_data.getColumnCount();
            for(int i=0;i<cNum;i++)
                vs.add(m_data.getColumnName(i));
            return(vs);
        }
        public int mb_getRowCurrent()
        {
            int r=m_view.getSelectedRow();
            if(r<0)
                r=0;
            return(r);

        }
        public String calculate(int num)//调用出题算法函数
        {
            Random rnd=new Random();
            int t=rnd.nextInt(5)+2;//随机选择计算的数字个数
            String s="";
            switch(canshu[1])//根据参数选择出题的函数进行出题
            {
                case 0:
                {
                    switch(canshu[2])
                    {
                        default:
                        {
                            if(canshu[0]==0)
                            {
                                s=p.admi(canshu[4],t,num);
                            }
                            else
                                s=p.admix(canshu[4],t,canshu[0],num);
                        }break;
                    }
                }break;
                case 1:
                {
                    switch(canshu[2])
                    {
                        case 0:
                        {
                            if(canshu[0]==0)
                                s=p.ammd(canshu[4],t,num);
                            else
                                s=p.ammdx(canshu[4], t, canshu[0], num);
                        }break;
                        case 1:
                        {
                            if(canshu[0]==0)
                                s=p.kammd(canshu[4],t,num);
                            else
                                s=p.kammdx(canshu[4], t, canshu[0], num);
                        }break;
                    }
                }break;
            }
            return s;//返回算术式
        }


public void jiaojuan()//提交答案函数，并会自动计算正确率，显示答案
{
    int n=30;
    if(canshu[3]!=0)
        n=50;
    for(int i=0;i<n;i++)
    {
         Object obj=m_data.getValueAt(i, 1);
         if(canshu[0]==0&&canshu[1]==0)
         {
             Double j1;
             if(obj!=null)
             {
                 try
                 {
                    j1=Double.parseDouble(obj.toString());
                 }
                 catch(Exception e)
                 {
                     Integer a1=p.a[n-i-1]+1;
                    String s=a1.toString();
                    j1=Double.parseDouble(s);
                 }
             }
             else
             {
                 Integer a1=p.a[n-i-1]+1;
                 String s=a1.toString();
                 j1=Double.parseDouble(s);
             }
             if(Math.abs((j1-p.a[n-i-1]))<0.00001)
                 test[i]=true;
             else
                 test[i]=false;
            //System.out.println(test[i]);
         }
         else
         {
             Double j1;
             if(obj!=null)
             {
                 try
                 {
                    j1=Double.parseDouble(obj.toString());
                 }
                 catch(Exception e)
                 {
                     j1=p.b[n-i-1]+1;
                 }
             }
             else
                 j1=p.b[n-i-1]+1;
             if((Math.abs(j1-p.b[n-i-1]))<=0.01)
                 test[i]=true;
             else
                 test[i]=false;
           
         }
         
    }
    int rNum=m_data.getRowCount();
    int cNum=m_data.getColumnCount();
    while(cNum!=2)
    {
        mb_deleteColumn1();
        cNum=m_data.getColumnCount();
    }
    mb_addColumn();
    mb_addColumn();
    int sum=0;
    for(int i=0;i<rNum;i++)
    {
        if(test[i])
        {
            m_data.setValueAt("√",i,2);//该题对则在该行后面打“√”
        }
        else
        {
            m_data.setValueAt("×",i,2);//否则打“×”
        }
         if(canshu[0]==0&&canshu[1]==0)
         {
            m_data.setValueAt(p.a[n-i-1], i, 3);
         }
         else
         {
              m_data.setValueAt(p.b[n-i-1], i, 3);
         }
         if(test[i])
         {
             sum++;
         }
    }
    sum=sum*100/n;
    mark.setSize(180,100);
    mark.mark.setText("你的正确率为："+sum+"%");
    if(canshu[3]==2)
    {
        mark.Time.setVisible(true);
        mark.Time.setText("剩余时间为："+string);
    }
    else
    {
         mark.Time.setVisible(false);
        mark.Time.setText("");
    }
    mark.setVisible(true);
    label.setVisible(false);
    textArea.setVisible(false);
}


 public JTextArea getTextArea() {
  return textArea;
 }

 public void setTextArea(JTextArea textArea) {
  this.textArea = textArea;
 }
 class Task extends TimerTask//用于倒数计时器
 {
  String string1 = string;
  DecimalFormat decimalFormat = new DecimalFormat("00");
  public void run() {
   if(flag1 == false){
    return;
   }
   // TODO Auto-generated method stub
   if(flag == true){
     intArray[2] -= 1;
     if(intArray[2] < 0)
     {
      intArray[1] -= 1;
      intArray[2] += 60;
      if(intArray[1] < 0)
      {
       intArray[0] -= 1;
       intArray[1] += 60;

      }
     }
     if(intArray[0] <= 0 && intArray[1] <= 0
       && intArray[2] <= 0)
     {
      flag1 = false;
      jiaojuan();
      //button.setEnabled(true);
      timer.cancel();
      string = new String(intArray[0] + ":" + intArray[1]
                                                       + ":" + intArray[2]);
      string = string.format("%02d:%02d:%02d", 00,00,10);
      textArea.setText(string);
      string = "0:25:00";
      String []stringArray = string.split(":");
      intArray = new int[3];
      for(int i = 0;i < stringArray.length;i++){
       intArray[i] = Integer.parseInt(stringArray[i]);
      }
      return;
     }
     string = string.format("%02d:%02d:%02d", intArray[0],intArray[1],intArray[2]);
     textArea.setText(string);
   }
  }
 }
 @Override
 public void run() {
  // TODO Auto-generated method stub

 }
    /**
     * @param args the command line arguments
     */

}
